package com.junction.util;

import com.junction.pojo.TaskPojo;
//import com.sun.xml.internal.bind.v2.TODO;
//import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.*;
import org.bytedeco.javacv.Frame;
//import org.bytedeco.librealsense.frame;
//import org.bytedeco.opencv.opencv_core.*;
//
//import javax.swing.*;
//import java.awt.*;
//import java.awt.image.BufferedImage;
import java.io.File;
//import java.lang.management.GarbageCollectorMXBean;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
//import java.util.concurrent.TimeUnit;

import static org.bytedeco.ffmpeg.global.avcodec.AV_CODEC_ID_H264;

public class ScreenCapture {
//    public void doScreenCapture(String[] args) {
//        try {
//            // 创建FrameGrabber对象来捕获屏幕
//            FrameGrabber grabber = FrameGrabber.createDefault(0);
//            grabber.start();
//
//            // 创建FrameRecorder对象来保存视频
//            FrameRecorder recorder = FrameRecorder.createDefault("screen_capture.mp4", 640, 480);
//            recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
//            recorder.setFormat("mp4");
//            recorder.start();
//
//            // 循环捕获屏幕并保存为MP4文件
//            Frame frame;
//            long previousTime = System.currentTimeMillis();
//            while ((frame = grabber.grab()) != null) {
//                recorder.record(frame);
//                long currentTime = System.currentTimeMillis();
//                if (currentTime - previousTime >= 60000) {
//                    // 生成新的MP4文件并清空录制缓冲区
//                    recorder.stop();
//                    grabber.stop();
//                    Thread.sleep(1000); // 等待1秒钟，以便文件写入磁盘
//                    recorder = FrameRecorder.createDefault("screen_capture" + System.currentTimeMillis() + ".mp4", 640, 480);
//                    recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
//                    recorder.setFormat("mp4");
//                    recorder.start();
//                    previousTime = currentTime;
//                }
//            }
//
//            // 停止录制并释放资源
//            recorder.stop();
//            grabber.stop();
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            // 释放资源（可选）
//        }
//    }


//    public static void captureScreen() {
//        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();// 获取当前屏幕大小
//        Rectangle rectangle = new Rectangle(screenSize);// 指定捕获屏幕区域大小，这里使用全屏捕获
//        //做好自己!--eguid，eguid的博客是:blog.csdn.net/eguid_1
//        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();//本地环境
//        GraphicsDevice[] gs = ge.getScreenDevices();//获取本地屏幕设备列表
//        System.err.println("eguid温馨提示，找到" + gs.length + "个屏幕设备");
//        Robot robot = null;
//        int ret = -1;
//        for (int index = 0; index < 10; index++) {
//            GraphicsDevice g = gs[index];
//            try {
//                robot = new Robot(g);
//                BufferedImage img = robot.createScreenCapture(rectangle);
//                if (img != null && img.getWidth() > 1) {
//                    ret = index;
//                    break;
//                }
//            } catch (AWTException e) {
//                System.err.println("打开第" + index + "个屏幕设备失败，尝试打开第" + (index + 1) + "个屏幕设备");
//            }
//        }
//        System.err.println("打开的屏幕序号：" + ret);
//        CanvasFrame frame = new CanvasFrame("eguid屏幕录制");// javacv提供的图像展现窗口
//        int width = 800;
//        int height = 600;
//        frame.setBounds((int) (screenSize.getWidth() - width) / 2, (int) (screenSize.getHeight() - height) / 2, width,
//                height);// 窗口居中
//        frame.setCanvasSize(width, height);// 设置CanvasFrame窗口大小
//        while (frame.isShowing()) {
//            BufferedImage image = robot.createScreenCapture(rectangle);// 从当前屏幕中读取的像素图像，该图像不包括鼠标光标
//            frame.showImage(image);
//
//            try {
//                Thread.sleep(45);
//            } catch (InterruptedException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
//        }
//        frame.dispose();
//    }




    public static void captureScreen(TaskPojo taskPojo) {
        try {
            // 设置输出文件名和格式
            String outputFilename = "output.mp4";
            LocalDateTime now1 = LocalDateTime.now();
            DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
            String formattedDateTime1 = now1.format(formatter1);
            outputFilename =  taskPojo.getFilePath() + File.separator + "output_" + formattedDateTime1 + ".mp4";

//            File f = new File(outputFilename);
//            if(!f.exists()){
//                f.createNewFile();
//            }

            int frameRate = 30; // 每秒帧数

            // 创建FFmpegFrameGrabber对象，用于捕获桌面视频
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
            grabber.setFormat("gdigrab");
            grabber.start();

            // 获取视频的宽度、高度和帧率
            int width = grabber.getImageWidth();
            int height = grabber.getImageHeight();
            int fps = (int) grabber.getFrameRate();

            // 计算每分钟的帧数
            int framesPerMinute = fps * 60;

            // 创建FFmpegFrameRecorder对象，用于录制视频
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFilename, width, height);
            recorder.setFormat("mp4");
            recorder.setFrameRate(frameRate);
            recorder.setVideoCodec(AV_CODEC_ID_H264);
            recorder.setAudioChannels(grabber.getAudioChannels());
            recorder.setAudioCodec(grabber.getAudioCodec());
            recorder.setSampleRate(grabber.getSampleRate());
            recorder.setGopSize(12);
            recorder.setMaxBFrames(2);
            recorder.start();

            // 逐帧捕获并录制视频
            Frame frame;
            int frameCount = 0;
            while ((frame = grabber.grab()) != null) {
                recorder.record(frame);
                frameCount++;

                // 每分钟保存一个MP4文件
                if (frameCount >= framesPerMinute) {
                    recorder.stop();

                    recorder.release();
                    LocalDateTime now = LocalDateTime.now();
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
                    String formattedDateTime = now.format(formatter);
                    outputFilename =  taskPojo.getFilePath() + File.separator +"output_" + formattedDateTime + ".mp4";

//                    File f1 = new File(outputFilename);
//                    if(!f1.exists()){
//                        f1.createNewFile();
//                    }


                    System.out.println("Saved video: " + outputFilename);

                    // TODO 启动线程上报到 华为云obs

                    recorder = new FFmpegFrameRecorder(outputFilename, width, height);
                    recorder.setFormat("mp4");
                    recorder.setFrameRate(frameRate);
                    recorder.setVideoCodec(AV_CODEC_ID_H264);
                    recorder.setAudioChannels(grabber.getAudioChannels());
                    recorder.setAudioCodec(grabber.getAudioCodec());
                    recorder.setSampleRate(grabber.getSampleRate());
                    recorder.setGopSize(12);
                    recorder.setMaxBFrames(2);
                    recorder.start();
                    frameCount = 0;
                }
            }

            // 停止录制并释放资源
            recorder.stop();
            recorder.release();
            grabber.stop();
            grabber.release();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }



    }

    public static void main(String[] args) {
//        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
//        // ffmpeg -f gdigrab -i desktop D://output.mp4
//        grabber.setFormat("gdigrab");
//		grabber.setOption("offset_x", "0");
//		grabber.setOption("offset_y", "0");
//		grabber.setOption("framerate", "25");
//		grabber.setOption("draw_mouse", "0");
//		grabber.setOption("video_size", "1920x1080");
//		grabber.setOption("probesize", "256");
//
//
//
//        // 这种形式，双屏有问题
//        // grabber.setImageWidth(1920);
//        // grabber.setImageWidth(1080);
//        try {
//            grabber.start();
//
//        CanvasFrame canvas = new CanvasFrame("摄像头");
//        canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        canvas.setAlwaysOnTop(true);
//
//        while (canvas.isDisplayable()) {
//            canvas.showImage(grabber.grab());
//            TimeUnit.MILLISECONDS.sleep(40);
//        }
//
//        grabber.stop();
//        } catch (FrameGrabber.Exception | InterruptedException e) {
//            throw new RuntimeException(e);
//        }
        try {
            // 设置输出文件名和格式
            String outputFilename = "output.mp4";
            LocalDateTime now1 = LocalDateTime.now();
            DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
            String formattedDateTime1 = now1.format(formatter1);
            outputFilename = "output_" + formattedDateTime1 + ".mp4";
            int frameRate = 30; // 每秒帧数

            // 创建FFmpegFrameGrabber对象，用于捕获桌面视频
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
            grabber.setFormat("gdigrab");
            grabber.start();

            // 获取视频的宽度、高度和帧率
            int width = grabber.getImageWidth();
            int height = grabber.getImageHeight();
            int fps = (int) grabber.getFrameRate();

            // 计算每分钟的帧数
            int framesPerMinute = fps * 60;

            // 创建FFmpegFrameRecorder对象，用于录制视频
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFilename, width, height);
            recorder.setFormat("mp4");
            recorder.setFrameRate(frameRate);
            recorder.setVideoCodec(AV_CODEC_ID_H264);
            recorder.setAudioChannels(grabber.getAudioChannels());
            recorder.setAudioCodec(grabber.getAudioCodec());
            recorder.setSampleRate(grabber.getSampleRate());
            recorder.setGopSize(12);
            recorder.setMaxBFrames(2);
            recorder.start();

            // 逐帧捕获并录制视频
            Frame frame;
            int frameCount = 0;
            while ((frame = grabber.grab()) != null) {
                recorder.record(frame);
                frameCount++;

                // 每分钟保存一个MP4文件
                if (frameCount >= framesPerMinute) {
                    recorder.stop();

                    recorder.release();
                    LocalDateTime now = LocalDateTime.now();
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
                    String formattedDateTime = now.format(formatter);
                    outputFilename = "output_" + formattedDateTime + ".mp4";
                    System.out.println("Saved video: " + outputFilename);
                    recorder = new FFmpegFrameRecorder(outputFilename, width, height);
                    recorder.setFormat("mp4");
                    recorder.setFrameRate(frameRate);
                    recorder.setVideoCodec(AV_CODEC_ID_H264);
                    recorder.setAudioChannels(grabber.getAudioChannels());
                    recorder.setAudioCodec(grabber.getAudioCodec());
                    recorder.setSampleRate(grabber.getSampleRate());
                    recorder.setGopSize(12);
                    recorder.setMaxBFrames(2);
                    recorder.start();
                    frameCount = 0;
                }
            }

            // 停止录制并释放资源
            recorder.stop();
            recorder.release();
            grabber.stop();
            grabber.release();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }


//        try {
//
//        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
//        grabber.setFormat("gdigrab");
//        try {
//            grabber.start();
//        } catch (FrameGrabber.Exception e) {
//            throw new RuntimeException(e);
//        }
//
//
//
//        // 创建FFmpegFrameRecorder对象，用于保存帧为mp4文件
//        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("output.mp4", grabber.getImageWidth(), grabber.getImageHeight());
//        recorder.setVideoOption("crf", "27"); // 设置视频的质量，crf值越小，质量越高，你可以根据需要调整这个值
//        recorder.setVideoBitrate(grabber.getVideoBitrate()/1000); // 设置视频的比特率
//        recorder.setFrameRate(grabber.getFrameRate()); // 设置帧率
//        recorder.setVideoCodec(grabber.getVideoCodec()); // 设置视频编码器
//        recorder.setAudioBitrate(grabber.getAudioBitrate()); // 设置音频比特率
//        recorder.setAudioCodec(grabber.getAudioCodec()); // 设置音频编码器
//        recorder.setAudioChannels(grabber.getAudioChannels()); // 设置音频通道数
//        recorder.setFormat("mp4"); // 设置输出文件格式为mp4
//        recorder.setVideoCodecName("libx264"); // 设置视频编码器为libx264，这个编码器可以提供高质量的视频，同时兼容性比较好
//        recorder.setOption("crf", "27"); // 设置视频的质量，crf值越小，质量越高，你可以根据需要调整这个值
//        recorder.setOption("preset", "ultrafast"); // 设置压缩速度和质量的预设值，你可以根据需要调整这个值
//        recorder.setOption("tune", "zerolatency"); // 设置零延迟编码器配置，你可以根据需要调整这个值
//        try {
//            recorder.start(); // 开始录制视频，第一个参数为true表示启用硬件加速
//        } catch (FrameRecorder.Exception e) {
//            throw new RuntimeException(e);
//        }
//
//        long startTime = System.currentTimeMillis();
//        while (true) {
//            // 从FFmpegFrameGrabber对象中获取一帧图像
//            Frame frame = grabber.grab();
//            if (frame == null) {
//                break;
//            }
//            // 将获取到的帧保存到中间输出文件中
//
//                recorder.record(frame);
//
//            long currentTime = System.currentTimeMillis();
//            if (currentTime - startTime >= 60000) { // 每60秒保存一次文件并清空中间输出文件
//                recorder.stop(); // 停止录制视频
//                recorder.start(); // 重新开始录制视频
//                startTime = System.currentTimeMillis(); // 重置开始时间
//            }
//
//        }
//        // 停止录制视频并释放资源
//        grabber.stop();
//        recorder.stop();
//
//
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }


//        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
//        grabber.setFormat("gdigrab");
//        try {
//            grabber.start();
//        } catch (FrameGrabber.Exception e) {
//            throw new RuntimeException(e);
//        }
//        Thread frameProcessingThread = new Thread(() -> {
//            try {
//                while (true) {
//                    Frame frame = null;
//                    try {
//                        frame = grabber.grab();
//                    } catch (FrameGrabber.Exception e) {
//                        throw new RuntimeException(e);
//                    }
//                    if (frame != null) {
//                        // 对帧进行处理，例如保存为mp4文件
//                        saveFrameToMp4(frame);
//                    }
//                    // 暂停60秒，以每分钟保存一个文件
//                    Thread.sleep(60000);
//                }
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        });
//        frameProcessingThread.start();


    }


    public static void saveFrameToMp4(Frame frame) {
        // 设置输出文件名称为当前时间戳加上".mp4"后缀
        try {
            String outputFileName = System.currentTimeMillis() + ".mp4";
            // 创建输出流，将帧写入到文件中
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFileName, 1920, 1080);
            recorder.setFormat("mp4");
            recorder.setFrameRate(24); // 设置帧率为24fps，可以根据需要调整
            if (recorder.isCloseOutputStream()) {
                System.out.println("Failed to open output file for writing");
                return;
            }

            recorder.record(frame); // 将帧写入到文件中

            recorder.close(); // 关闭输出流和文件句柄释放资源
        } catch (FrameRecorder.Exception e) {
            throw new RuntimeException(e);
        }
    }
}
